package org.tri.persistence.search;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.tri.entity.AbstractVenta;
import org.tri.entity.Categoria;

/**
 * La clase {@code AbstractBusquedaVenta} representa la base de la 
 * jerarquía de busquedas de Ventas.
 * @author kiira
 * @version 1.0, Nov 20, 2011
 */
public abstract class AbstractBusquedaVenta<K extends AbstractVenta>
        extends BusquedaTransaccion<K> {

    /**
     * Inicializa la busqueda.
     * @param clase clase de los objetos a buscar.
     */
    public AbstractBusquedaVenta( Class<K> clase ) {
        super( clase );

    }//end constructor

    /**
     * Restringe la busqueda a una sola venta, cuyo DTA
     * coincida con el número indicado.
     * @param numeroDta número de DTA de la venta buscada.
     */
    public void porNumeroDeDtaExacto( Long numeroDta ) {
        //creamos y agregamos la restriccion
        Criterion restriccionDta = Restrictions.eq( "nroDta", numeroDta );

        agregarCriterio( restriccionDta );

    }//end método porNumeroDeDtaExacto

    /**
     * Restringe la busqueda a aquellas ventas que posean
     * la {@code String} indicada como inicio de su DTA.
     * @param numeroDta número de DTA o porción de número de DTA
     * por el cual filtrar.
     */
    public void porNumeroDeDta( String numeroDta ) {
        //creamos y agregamos la restriccion
        Criterion restriccionDta = Restrictions.sqlRestriction(
                String.format( "CAST( {alias}.nro_dta as string ) like '%s%%'",
                               numeroDta ) );

        agregarCriterio( restriccionDta );

    }//end método porNumeroDeDta

    /**
     * Restringe la busqueda a aquellas ventas que posean
     * el número indicado como inicio de su DTA.
     * @param numeroDta número de DTA o porción de número de DTA
     * por el cual filtrar.
     */
    public void porNumeroDeDta( Long numeroDta ) {
        porNumeroDeDta( String.valueOf( numeroDta ) );

    }//end método porNumeroDeDta

    /**
     * Restringe la busqueda a una categoría de animal específica.
     * @param categoria categoria por la cual filtrar.
     */
    public void porCategoria( Categoria categoria ) {
        //creamos y agregamos la restriccion
        Criterion restriccionCategoria = Restrictions.eq(
                "categoria", categoria.getIdCategoria() );

        agregarCriterio( restriccionCategoria );

    }//end método porCategoria

    /**
     * Restringe la busqueda a aquellas ventas en la que el 
     * nombre del destinatario contenga el nombre indicado.
     * @param nombre nombre o porción de nombre por la cual buscar.
     */
    public void porDestinatario( String nombre ) {
        //creamos y agregamos la restriccion
        Criterion restriccionDestinatario = Restrictions.like( 
                "destinatario", "%" + nombre + "%" );

        agregarCriterio( restriccionDestinatario );

    }//end método porNombreDestinatario

    /**
     * Rrestringe la busqueda a las ventas cuyo destinatario
     * tenga la {@code String} indicada en su renspa.
     * @param renspa renspa o porción de renspa por la cual filtrar.
     */
    public void porRenspaDestinatario( String renspa ) {
        //creamos y agregamos la restriccion
        Criterion restriccionDestinatario = Restrictions.sqlRestriction(
                String.format( "CAST( {alias}.destino_renspa as string ) "
                               + "like '%s%%'", renspa ) );

        agregarCriterio( restriccionDestinatario );

    }//end método porRenspaDestinatario

    /**
     * Restringe la busqueda a las ventas cuyo destinatario
     * tenga una renspa que contenga el número indicado.
     * @param renspa renspa o porción de renspa por la cual filtrar.
     */
    public void porRenspaDestinatario( Long renspa ) {
        porRenspaDestinatario( String.valueOf( renspa ) );

    }//end método porRenspaDestinatario

    /**
     * Restringe la busqueda a las ventas cuyo destinatario
     * posee la renspa indicada.
     * @param renspa renspa por la cual filtrar.
     */
    public void porRenspaDestinatarioExacto( Long renspa ) {
        //creamos y agregamos la restriccion
        Criterion restriccionDestinatario = Restrictions.eq( 
                "renspaDestinatario", renspa );

        agregarCriterio( restriccionDestinatario );

    }//end método porRenspaDestinatario

}//end clase AbstractBusquedaVenta

